#include "Queue.h"
void QueueInit(Queue* pq)
{
    assert(pq);
    pq->head = pq->tail = NULL;
    pq->size = 0;
}
void QueueDestroy(Queue* pq)
{
    assert(pq);
    QNode* pcur = pq->head;
    while (pcur)
    {
        QNode* next = pcur->next;
        free(pcur);
        pcur = next;
    }
    pq->head = pq->tail = NULL;
    pq->size = 0;
    
}
void QueuePush(Queue* pq, QDataType x)
{
    assert(pq);
    QNode* newnode = (QNode*)malloc(sizeof(QNode));
    if (newnode == NULL)
    {
        perror("malloc fail!");
        return;
    }
    newnode->val = x;
    //没有注意:
    newnode->next = NULL;
    if (pq->tail == NULL)
    {
         pq->head = pq->tail = newnode;
    }
    else
    {
        pq->tail->next = newnode;
        pq->tail = newnode;
    }
    pq->size++;
}
// 队头删除
void QueuePop(Queue* pq)
{
    assert(pq && pq->size);
    //这里注意：一个节点呢？

    QNode* next = pq->head->next;
    if (next == NULL)
    {
        free(pq->head);//此时pq->head和pq->tail的空间是一个，释放了一个就行
        pq->head = pq->tail = NULL;

    }
    else
    {

        free(pq->head);
        pq->head = next;
    }
    

    pq->size--;
}

// 取队头和队尾的数据
QDataType QueueFront(Queue* pq)
{
    assert(pq && pq->head);
    return pq->head->val;
}
QDataType QueueBack(Queue* pq)
{
    assert(pq && pq->tail);
    return pq->tail->val;
}

int QueueSize(Queue* pq)
{
    assert(pq);
    return pq->size;
}
bool QueueEmpty(Queue* pq)
{
    assert(pq);
    return pq->size == 0;
}